
//2025-1-15 16:50:54修改版本
export class ReactiveAutoSave {
    private static _ins: ReactiveAutoSave | null = null; // 单例实例
    private data: any = {}; // 存储的数据
    private localStorageKey: string = 'gameData'; // 本地存储的键名，默认为 'gameData'
    private defaultValue: any = {}; // 默认值

    // 私有构造函数，防止外部直接实例化
    private constructor() {}

    // 单例模式：获取实例
    public static get ins(): ReactiveAutoSave {
        if (!this._ins) {
            this._ins = new ReactiveAutoSave();
            // 如果已经通过 init 设置了 localStorageKey 和 defaultValue，则初始化数据
            if (this._ins.localStorageKey && this._ins.defaultValue) {
                this._ins.loadDataFromLocalStorage(this._ins.defaultValue);
                this._ins.makeDataReactive(this._ins.data);
            }
        }
        return this._ins;
    }

    // 初始化单例（支持传入键名和默认值）
    public static init(localStorageKey: string, defaultValue: any = {}) {
        if (!this._ins) {
            this._ins = new ReactiveAutoSave();
        }
        this._ins.localStorageKey = localStorageKey;
        this._ins.defaultValue = defaultValue;
        this._ins.loadDataFromLocalStorage(defaultValue);
        this._ins.makeDataReactive(this._ins.data);
        return this._ins;
    }

    // 加载数据
    private loadDataFromLocalStorage(defaultValue: any) {
        const savedData = cc.sys.localStorage.getItem(this.localStorageKey);
        if (savedData) {
            try {
                this.data = JSON.parse(savedData);
                console.log('数据加载成功:', this.data);
            } catch (error) {
                console.error('加载本地数据失败:', error);
                this.data = defaultValue; // 使用默认值
                this.saveDataToLocalStorage(); // 保存默认值
            }
        } else {
            this.data = defaultValue; // 使用默认值
            this.saveDataToLocalStorage(); // 保存默认值
        }
    }

    // 保存数据
    private saveDataToLocalStorage() {
        try {
            const dataString = JSON.stringify(this.data);
            cc.sys.localStorage.setItem(this.localStorageKey, dataString);
            console.log('数据保存成功:', this.data);
        } catch (error) {
            console.error('保存数据到本地失败:', error);
        }
    }

    // 将数据转换为响应式
    private makeDataReactive(data: any) {
        if (typeof data !== 'object' || data === null) {
            return;
        }

        for (const key in data) {
            if (data.hasOwnProperty(key)) {
                this.defineReactiveProperty(data, key, data[key]);
            }
        }
    }

    // 定义响应式属性
    private defineReactiveProperty(obj: any, key: string, value: any) {
        // 递归处理嵌套对象
        this.makeDataReactive(value);

        Object.defineProperty(obj, key, {
            enumerable: true,
            configurable: true,
            get: () => {
                return value;
            },
            set: (newValue) => {
                if (newValue !== value) {
                    console.log(`属性 ${key} 发生变化，新值为:`, newValue);
                    value = newValue;

                    // 递归处理新值
                    this.makeDataReactive(newValue);

                    // 数据变化时自动保存
                    this.saveDataToLocalStorage();
                }
            },
        });
    }

    // 获取数据
    public getData(): any {
        return this.data;
    }

    // 设置数据
    public setData(newData: any) {
        this.data = { ...newData };
        this.makeDataReactive(this.data); // 确保新数据是响应式的
        this.saveDataToLocalStorage(); // 保存数据
    }
}